// Reverb model declaration
//
// Written by Jezar at Dreampoint, June 2000
// http://www.dreampoint.co.uk
// This code is public domain

#ifndef _revmodel_
#define _revmodel_

#include "comb.hpp"
#include "allpass.hpp"
#include "tuning.h"

class revmodel {
public:
    revmodel();

    void mute();

    void processmix(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples,
                    int skip);

    void
    processreplace(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples,
                   int skip);

    void setroomsize(float value);

    float getroomsize();

    void setdamp(float value);

    float getdamp();

    void setwet(float value);

    float getwet();

    void setdry(float value);

    float getdry();

    void setwidth(float value);

    float getwidth();

    void setmode(float value);

    float getmode();

private:
    void update();

private:
    float gain;
    float roomsize, roomsize1;
    float damp, damp1;
    float wet, wet1, wet2;
    float dry;
    float width;
    float mode;

    // The following are all declared inline
    // to remove the need for dynamic allocation
    // with its subsequent error-checking messiness

    // Comb filters
    comb combL[numcombs];
    comb combR[numcombs];

    // Allpass filters
    allpass allpassL[numallpasses];
    allpass allpassR[numallpasses];

    // Buffers for the combs
    float bufcombL1[combtuningL1];
    float bufcombR1[combtuningR1];
    float bufcombL2[combtuningL2];
    float bufcombR2[combtuningR2];
    float bufcombL3[combtuningL3];
    float bufcombR3[combtuningR3];
    float bufcombL4[combtuningL4];
    float bufcombR4[combtuningR4];
    float bufcombL5[combtuningL5];
    float bufcombR5[combtuningR5];
    float bufcombL6[combtuningL6];
    float bufcombR6[combtuningR6];
    float bufcombL7[combtuningL7];
    float bufcombR7[combtuningR7];
    float bufcombL8[combtuningL8];
    float bufcombR8[combtuningR8];

    // Buffers for the allpasses
    float bufallpassL1[allpasstuningL1];
    float bufallpassR1[allpasstuningR1];
    float bufallpassL2[allpasstuningL2];
    float bufallpassR2[allpasstuningR2];
    float bufallpassL3[allpasstuningL3];
    float bufallpassR3[allpasstuningR3];
    float bufallpassL4[allpasstuningL4];
    float bufallpassR4[allpasstuningR4];
};

#endif//_revmodel_

//ends